package algoritmos;

import java.util.Date;

/**
 * Clase abstracta que definirá los distintos algoritmos presentados
 * en clase.
 * @author Alberto Milán
 *
 */
public abstract class Algoritmo implements Runnable{

	/**
	 * Hilo de ejecución concurrente
	 */
	protected Thread thread;
	
	/**
	 * Tiempo de inicio del hilo
	 */
	protected Date startTime; 
	
	/**
	 * Constructor de la clase
	 *
	 */
	public Algoritmo(){
	}
	
	/**
	 * Lanza el hilo de ejecución de aprendizaje
	 */
	public void run() {
		startTime = new Date();
		aprendizaje();
	}
	
	/** 
	 * Lanza el hilo de ejecución concurrente
	 */
	public void start(){
		if(thread == null) {
	        thread = new Thread(this);
	        thread.start();
	    }
		else thread = null;
	}
	
	/**
	 * Espera la terminación del hilo, para posibles sincronizaciones
	 */
	public void join(){
		if (thread != null){
			try {
				thread.join();
			} catch (InterruptedException e) {
				System.out.println("Thread interrumpido");
			}
		}
	}
	
	/**
	 * Ejecuta el cuerpo del algoritmo.
	 */
	protected abstract void aprendizaje();
}
